<!DOCTYPE html>
<html>
<head>
  <title>alt</title>
</head>
<body>
<script type="text/javascript">
  // function alt(func1, func2) {
  //   return (val) => {
  //     return func1(val) || func2(val);
  //   }
  // }

  // function t(i) {
  //   console.log('if')
  //   let arr = [1,2,3,4];
  //   if(arr[i]) return arr[i]
  //   return false
  // }

  // function b(val) {
  //   console.log('else')
  //   return val
  // }

  // let bb = alt(t, b);
  // console.log(bb(1))
  // step1 编码参数(北京, 上海)
  // step2 #q=step1&encode=true
  // step3 每次进来查找encode=true 有  不重新编码 无重新编码
  // http://xxxx.com/p/a/d/dash#q=step1&encode=true

  function map(fn, arr) {
    var result = [];
    for(var i = 0; i < arr.length; i++)
      result.push(fn(arr[i], i))
    return result;
  }

  function curryMap(fn) {
    return function(arr) {
      return map(fn, arr)
    }
  }

  function reduce(fn, list, initValue) {
    let acc = initValue;
    if (initValue) 
      acc = initValue;
    else
      acc = list.shift();
    for(var i =0; i < list.length; i++)
      acc = fn(acc, list[i])

    return acc;
  }

  console.log(reduce((acc, item) => {
    return (acc+=item)
  }, [1,2], 0))

  function add() {
    const list = Array.prototype.slice.call(arguments);
    return reduce((acc, item) => {
      return (acc+=item)
    }, list, 0)
  }

  console.log('add', add(1,2,1,1,1,1))

  function compose() {
    const funs = Array.prototype.slice.call(arguments);
    if(!funs.length)
      return arg => arg;

    if(funs.length === 1)
      return funs[0]

    return reduce((a, b) => (...args) => a(b(...args)) , funs)// a(b(arg))
  }

  var mapTd = curryMap(function(item, i) {
    return ' <td>'+item+'</td>'
  })
  var renderTboayItem = curryMap(function (list, i) {
    var tds = mapTd(list).join('\n');
    return ' <tr>\n'+tds+'\n</tr>\n'
  })

  var mableDataList = curryMap(function(item, i) {
    return [item.name1, item.name2, item.name3, item.name4]
  })

  var i = id => {
    console.log(id);
    return id
  }

  var test = compose(i, renderTboayItem, mableDataList);

  var tbody = test([
    {
      name1: '表格1',
      name2: '表格2',
      name3: '表格3',
      name4: '表格4'
    },
    {
      name1: '表格12',
      name2: '表格23',
      name3: '表格32',
      name4: '表格42'
    },
    {
      name1: '表格13',
      name2: '表格23',
      name3: '表格33',
      name4: '表格43'
    }
  ]).join('')

  console.log('<tbody>\n'+tbody+'\n</tbody>')

  // blink
  //   .step(1)
  //   .count(1)
  //   .track("aaaa", {
  //     a:1
  //   })
</script>
</body>
</html>